/****************************************************************************
**
** WX公众号:Qt历险记
** CSDN:Qt魔术师
**
****************************************************************************/

#include "previewwindow.h"

#include <QPushButton>
#include <QTextEdit>
#include <QVBoxLayout>

#include <QDebug>

//! [构造函数在对象创建时执行]
PreviewWindow::PreviewWindow(QWidget *parent)
    : QWidget(parent)
{
    // 如果对象是指针 并且你要在构造函数就创建空间 那么头文件的指针可以不初始化
    // 如果对象是指针 并且你要在构造函数不创建空间 那么头文件的指针应该初始化=nullptr 比较安全
    textEdit = new QTextEdit;
    textEdit->setReadOnly(true);
    textEdit->setLineWrapMode(QTextEdit::NoWrap); // 不换行

    closeButton = new QPushButton(tr("&Close"));
    connect(closeButton, &QPushButton::clicked,
            this, &PreviewWindow::close);

    // 垂直布局
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(textEdit);
    layout->addWidget(closeButton);
    setLayout(layout);

    setWindowTitle(tr("预览窗"));
}
//! [END]

//! [设置窗口的标志 复选的可以和单选的组合]
void PreviewWindow::setWindowFlags(Qt::WindowFlags flags)
{
    qDebug()<<" flags = "<<flags;
    QWidget::setWindowFlags(flags);

    QString text;

    // &与运算 【单选】
    Qt::WindowFlags type = (flags & Qt::WindowType_Mask);   // WindowType_Mask = 0x000000ff
    if (type == Qt::Window)         // 0x00000001 有标题和图标 最大化 最小化 X退出
        text = "Qt::Window";
    else if (type == Qt::Dialog)    // 0x00000003 有标题和图标 ？帮助  X退出
        text = "Qt::Dialog";
    else if (type == Qt::Sheet)     // 0x00000005 有标题和图标 ？帮助  X退出 macOS平台
        text = "Qt::Sheet";
    else if (type == Qt::Drawer)    // 0x00000007 有标题 X退出 macOS平台
        text = "Qt::Drawer";
    else if (type == Qt::Popup)     // 0x00000009 空弹出窗口
        text = "Qt::Popup";
    else if (type == Qt::Tool)      // 0x000000011 有标题 X退出 开始是灰色 鼠标点击后恢复样式
        text = "Qt::Tool";
    else if (type == Qt::ToolTip)   // 0x000000013  空弹出窗口
        text = "Qt::ToolTip";
    else if (type == Qt::SplashScreen)  // 0x000000015 空弹出窗口 指示该窗口是一个启动屏幕
        text = "Qt::SplashScreen";

    // &与运算 【多选】
    if (flags & Qt::MSWindowsFixedSizeDialogHint)   // MS Windows固定大小对话框提示 = 0x00000100
        text += "\n| Qt::MSWindowsFixedSizeDialogHint";
    if (flags & Qt::X11BypassWindowManagerHint)
        text += "\n| Qt::X11BypassWindowManagerHint";   // X11绕过窗口管理器提示 = 0x00000400
    if (flags & Qt::FramelessWindowHint)                // 无框架窗口提示 = 0x00000800
        text += "\n| Qt::FramelessWindowHint";
    if (flags & Qt::NoDropShadowWindowHint)             // 无放置阴影窗口提示 = 0x40000000
        text += "\n| Qt::NoDropShadowWindowHint";
    if (flags & Qt::WindowTitleHint)                    // 给这个窗口一个标题栏 = 0x00001000
        text += "\n| Qt::WindowTitleHint";
    if (flags & Qt::WindowSystemMenuHint)               // 添加了一个窗口系统菜单，可能还有一个关闭按钮（例如在mac上）。
        text += "\n| Qt::WindowSystemMenuHint";
    if (flags & Qt::WindowMinimizeButtonHint)           // 添加了一个最小化的按钮
        text += "\n| Qt::WindowMinimizeButtonHint";
    if (flags & Qt::WindowMaximizeButtonHint)           // 添加了一个最大化的按钮
        text += "\n| Qt::WindowMaximizeButtonHint";
    if (flags & Qt::WindowCloseButtonHint)              // 添加了一个关闭的按钮
        text += "\n| Qt::WindowCloseButtonHint";
    if (flags & Qt::WindowContextHelpButtonHint)        // 向对话框中添加一个上下文帮助按钮
        text += "\n| Qt::WindowContextHelpButtonHint";
    if (flags & Qt::WindowShadeButtonHint)              // 添加一个阴影按钮
        text += "\n| Qt::WindowShadeButtonHint";
    if (flags & Qt::WindowStaysOnTopHint)               // 通知窗口系统，该窗口应该保持在所有其他窗口的顶部。请注意，在x11上的一些窗口管理器上，您还必须传递Qt::X11BypassWindowManagerHint才能使这个标志正常工作。
        text += "\n| Qt::WindowStaysOnTopHint";
    if (flags & Qt::CustomizeWindowHint)                // 自定义窗口提示
        text += "\n| Qt::CustomizeWindowHint";

    textEdit->setPlainText(text);
}
//! [END]
